package com.nbsaas.boot.api.adapter;

import lombok.Data;

import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 服务实例模型类，用于描述注册到 nb-cloud-hub 的每个服务节点。
 */
@Data
public class ServiceInstance implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 服务名称（逻辑名）
     */
    private String name;

    private String namespace;

    /**
     * 实例地址（如：http://10.0.0.5:8080）
     */
    private String address;

    /**
     * 健康检查地址（如：http://10.0.0.5:8080/health）
     */
    private String healthCheckUrl;

    /**
     * 标签（可选，用于多环境、注册中心标记）
     */
    private List<String> tags;

    /**
     * 扩展元信息（版本、区域、权重等）
     */
    private Map<String, String> metadata;

    /**
     * 当前健康状态（UP / DOWN）
     */
    private String status = "UNKNOWN";

    /**
     * 最后心跳更新时间戳
     */
    private Instant lastHeartbeatTime;

    /**
     * 实例注册时间
     */
    private Instant registeredAt;

    // ===== Constructors =====

    // ===== 便捷方法 =====
    
    /**
     * 获取实例的主机地址
     */
    public String getHost() {
        if (address == null) {
            return null;
        }
        try {
            URI uri = new URI(address);
            return uri.getHost();
        } catch (URISyntaxException e) {
            // 如果地址格式不正确，尝试直接解析
            if (address.contains(":")) {
                return address.substring(0, address.lastIndexOf(":"));
            }
            return address;
        }
    }
    
    /**
     * 获取实例的端口号
     */
    public Integer getPort() {
        if (address == null) {
            return null;
        }
        try {
            URI uri = new URI(address);
            int port = uri.getPort();
            return port == -1 ? null : port;
        } catch (URISyntaxException e) {
            // 如果地址格式不正确，尝试直接解析
            if (address.contains(":")) {
                String portStr = address.substring(address.lastIndexOf(":") + 1);
                try {
                    return Integer.parseInt(portStr);
                } catch (NumberFormatException nfe) {
                    return null;
                }
            }
            return null;
        }
    }
    
    /**
     * 获取实例的协议
     */
    public String getProtocol() {
        if (address == null) {
            return null;
        }
        try {
            URI uri = new URI(address);
            return uri.getScheme();
        } catch (URISyntaxException e) {
            // 默认返回http
            return "http";
        }
    }
}